/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.foxinline.manager.criar;

import br.com.foxinline.enums.TipoDocumento;
import br.com.foxinline.modelo.*;
import br.com.foxinline.servico.*;
import br.com.foxinline.util.Caracter;
import br.com.foxinline.util.Msg;
import br.com.foxinline.utilitarios.EmailUtilitario;
import java.io.Serializable;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;
import org.primefaces.context.RequestContext;

/**
 *
 * @author laverson
 */
@ViewScoped
@ManagedBean
public class ManagerCriarEmpresa implements Serializable {

    @EJB
    UsuarioServico usuarioServico;
    @EJB
    PessoaServico pessoaServico;
    @EJB
    SetorServico setorServico;
    @EJB
    EnderecoServico enderecoServico;
    @EJB
    GrupoServico grupoServico;
    private Pessoa empresa;
    private Usuario usuario;
    private List<Usuario> usuarios;
    private Endereco endereco;
    private Setor setor;
    private List<Setor> setores;
    private boolean cnpjCadastrado = false;
    private static final String msgFailure = ":: Erro de validação: o valor é necessário.";

    @PostConstruct
    public void init() {
        empresa = new Pessoa();
        empresa.setTipoDocumento(TipoDocumento.CNPJ);

        setor = new Setor();
        setores = new ArrayList<Setor>();
        usuario = new Usuario();
        usuarios = new ArrayList<Usuario>();
        endereco = new Endereco();
    }

    public void salvar() {
        if (isEmpresaValida()) {
            if (isEnderecoValido()) {
                if (isExisteResponsavelLegal()) {

                    try {
                        empresa.setSetores(setores);
                        empresa.setEndereco(endereco);
                        pessoaServico.salvar(empresa);

                        if (!usuarios.isEmpty()) {
                            List<Usuario> usuariosEmpresa = new ArrayList<Usuario>();

                            List<Grupo> grupos = new ArrayList<Grupo>();
                            Grupo grupo = grupoServico.find("empresa");
                            grupos.add(grupo);

                            for (Usuario user : usuarios) {
                                user.setGrupos(grupos);
                                usuarioServico.salvar(user, true);

                                usuariosEmpresa.add(user);
                            }
                            empresa.setUsuarios(usuariosEmpresa);
                            pessoaServico.atualizar(empresa);
                        }

                        Msg.messagemInfoRedirect(Msg.SuccessFull, "indexempresa.xhtml");
                    } catch (Exception e) {
                        e.printStackTrace();
                        Msg.messagemError(Msg.Failure);
                    }

                    try {
                        if (!empresa.getUsuarios().isEmpty()) {
                            EmailUtilitario email = new EmailUtilitario();

                            for (Usuario user : empresa.getUsuarios()) {
                                email.enviarEmail(user.getEmail(), EmailUtilitario.primeiroAcesso(user), usuarioServico.getCurrentUser().getNome());
                            }
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                        Msg.messagemWarn("Ocorreu um erro ao enviar os emails !");
                    }

                } else {
                    Msg.messagemError("Deve existir pelo menos um responsável legal para a empresa ".concat(empresa.getNomeFantasia()).concat(" !"));
                }
            } else {
                RequestContext.getCurrentInstance().execute("requiredEndereco(true)");
            }
        } else {
            RequestContext.getCurrentInstance().execute("requiredEmpresa(true)");
        }
    }

    /**
     * Verifica se a empresa contém os campos CNPJ e Nome Fatasia devidamente
     * setados
     *
     * @return <b>true</b> caso estejam setados corretamente, <b>false</b> caso
     * contrário
     */
    private boolean isEmpresaValida() {
        if (empresa.getCnpj() == null || empresa.getCnpj().equals("")) {
            Msg.messagemError("CNPJ".concat(msgFailure));
        }

        if (empresa.getNomeFantasia() == null || empresa.getNomeFantasia().equals("")) {
            Msg.messagemError("Nome Fantasia".concat(msgFailure));
        }

        if ((empresa.getCnpj() == null || empresa.getCnpj().equals(""))
                || (empresa.getNomeFantasia() == null || empresa.getNomeFantasia().equals(""))) {
            return false;
        }

        return true;
    }

    /**
     * Verifica se o endereco possui o CEP setado corretamente
     *
     * @return <b>true</b> caso verdadeiro, <b>false</b> caso contrário
     */
    private boolean isEnderecoValido() {

        if (endereco.getCep() == null || endereco.getCep().equals("")) {
            Msg.messagemError("CEP".concat(msgFailure));
            return false;
        }

        return true;
    }

    public void existeCliente() {
        if (pessoaServico.existProprietario(empresa) != null) {
            Msg.messagemError("O CNPJ informado já está cadastrado !");
        }
    }

    public void adicionarUsuario() {
        if (isUsuarioValido()) {
            if (!existLogin()) {
                usuarios.add(usuario);
                usuario = new Usuario();
            } else {
                Msg.messagemError("Login indisponível !");
            }
        } else {
            RequestContext.getCurrentInstance().execute("requiredUsuario(true)");
        }
    }

    /**
     * Verifica se os campos (Nome, Login e E-mail) do usuário são válidos, ou
     * seja, não são nulos ou contém valores em branco
     *
     * @return <b>true</> caso seja válido, <b>false</b> caso contrário
     */
    private boolean isUsuarioValido() {

        if (usuario.getNome() == null || usuario.getNome().equals("")) {
            Msg.messagemError("Nome".concat(msgFailure));
        }

        if (usuario.getLogin() == null || usuario.getLogin().equals("")) {
            Msg.messagemError("Login".concat(msgFailure));
        }

        if (usuario.getEmail() == null || usuario.getEmail().equals("")) {
            Msg.messagemError("E-mail".concat(msgFailure));
        }

        if ((usuario.getNome() == null || usuario.getNome().equals(""))
                || (usuario.getLogin() == null || usuario.getLogin().equals(""))
                || (usuario.getEmail() == null || usuario.getEmail().equals(""))) {
            return false;
        }

        return true;
    }

    /**
     * Verifica se existe um responsável legal setado na empresa
     *
     * @return <b>true</b> se sexistir, <b>false</b> caso contrário
     */
    private boolean isExisteResponsavelLegal() {

        for (Usuario user : usuarios) {
            if (user.isResponsavelLegal()) {
                return true;
            }
        }

        return false;
    }

    public void removerUsuario(Usuario usuario) {
        usuarios.remove(usuario);
    }

    public void editarUsuario(Usuario usuario) {
        this.usuario = usuario;
        usuarios.remove(usuario);
    }

    public void adicionarSetor() {
        if (setor.getNome() != null && !setor.getNome().equals("")) {
            if (!setores.contains(setor)) {
                setores.add(setor);
                setor = new Setor();
            } else {
                Msg.messagemError("Já existe um setor adicionado com este nome !");
            }
        } else {
            Msg.messagemError("Nome".concat(msgFailure));
            RequestContext.getCurrentInstance().execute("requiredSetor(true)");
        }
    }

    public void removerSetor(Setor setor) {
        setores.remove(setor);
    }

    public void editarSetor(Setor setor) {
        this.setor = setor;
        setores.remove(setor);
    }

    public boolean existLogin() {
        return usuarioServico.existLogin(usuario.getLogin()) != null;
    }

    public String cnpjMask(String cnpj) {
        return Caracter.addMask(cnpj, Caracter.cnpjMask);
    }

    public Pessoa getEmpresa() {
        return empresa;
    }

    public void setEmpresa(Pessoa empresa) {
        this.empresa = empresa;
    }

    public Endereco getEndereco() {
        return endereco;
    }

    public void setEndereco(Endereco endereco) {
        this.endereco = endereco;
    }

    public List<Usuario> getUsuarios() {
        return usuarios;
    }

    public void setUsuarios(List<Usuario> usuarios) {
        this.usuarios = usuarios;
    }

    public List<Setor> getSetores() {
        return setores;
    }

    public void setSetores(List<Setor> setores) {
        this.setores = setores;
    }

    public boolean isCnpjCadastrado() {
        return cnpjCadastrado;
    }

    public void setCnpjCadastrado(boolean cnpjCadastrado) {
        this.cnpjCadastrado = cnpjCadastrado;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public Setor getSetor() {
        return setor;
    }

    public void setSetor(Setor setor) {
        this.setor = setor;
    }

    public void enviarEmail() {
        try {
            //        EmailUtilitario email = new EmailUtilitario();
            //
            //        email.enviarEmail("diego@foxinline.com", EmailUtilitario.primeiroAcesso(usuarioServico.find(15L)), "");

            FacesContext facesContext = FacesContext.getCurrentInstance();
            ServletContext servletContext = (ServletContext) facesContext.getExternalContext().getContext();
            URL pathImage = servletContext.getResource("/"); //getRealPath("/media/images/logo-fox-small.jpg");
            System.err.println(pathImage.getPath());
        } catch (MalformedURLException ex) {
            Logger.getLogger(ManagerCriarEmpresa.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
